/**
 * 
 */
package factory;

import java.util.ArrayList;
import java.util.Date;

import metier.*;

/**
 * @author Quipu-Team
 * 
 */
public abstract class Factory {

    /* CREATION INSTANCE CLASSE METIER */
    public abstract Salle creerSalle(String nom, int capacite);

    public abstract Groupe creerGroupe(String nom, int nombreEtudiants, Semestre semestre);
    public abstract Groupe creerGroupe() throws ExceptionMetier;

    public abstract Seance creerSeance(Service service, Salle salle, Date periode, int position);

    public abstract TypeHeure creerTypeHeure(String nom);
    
    public abstract Enseignant creerEnseignant(String nom, String prenom, StatutEnseignant statut);

    public abstract StatutEnseignant creerStatutEnseignant(String nom, int nbHeure);

    public abstract Service creerService(See see, Enseignant enseignant, TypeHeure typeheure, Groupe groupe);

    public abstract TypeEnseignement creerTypeEnseignement(String nom, int nombreHeuresEq);

    public abstract Matiere creerMatiere(UE ue, String nom, String description, int coefficient);
    public abstract Matiere creerMatiere();

    public abstract See creerSee(Matiere matiere, TypeEnseignement typeEnseignement, int nombreHeures);

    public abstract See creerSee();

    public abstract AnneeEtude creerAnneeEtude();

    public abstract Semestre creerSemestre(String nom, AnneeEtude annee, Date debut, Date fin);
    
    public abstract Semestre creerSemestre();
    
    public abstract Conge creerConge();

    public abstract TypeEnseignement creerTypeEnseignement();



    /* CREATION COLLECTION D'INSTANCES METIER */
    public abstract ArrayList<ElementListe> creerListeSalle();

    public abstract ArrayList<ElementListe> creerListeSeance();

    public abstract ArrayList<ElementListe> creerListeSeanceSpeciale() throws ExceptionMetier;
    public abstract ArrayList<Seance> creerListeSeanceSpeciale(Date debut, Date fin) throws ExceptionMetier;

    public abstract ArrayList<ElementListe> creerListeEnseignant()  throws ExceptionMetier;

    public abstract ArrayList<ElementListe> creerListeStatutEnseignant()  ;

    public abstract ArrayList<ElementListe> creerListeGroupe()throws ExceptionMetier;
    public abstract ArrayList<ElementListe> creerListeGroupeSemestre(int idSemestre) throws ExceptionMetier;
    
    public abstract ArrayList<ElementListe> creerListeTypeHeure()throws ExceptionMetier;
    
    public abstract ArrayList<ElementListe> creerListeService();

    public abstract ArrayList<UE> creerListeUE();

    public abstract ArrayList<ElementListe> creerListeAnneeEtude() throws ExceptionMetier;

    public abstract ArrayList<ElementListe> creerListeFormation();
    
    public abstract ArrayList<ElementListe> creerListeSemestre(AnneeEtude annee) throws ExceptionMetier;

    public abstract ArrayList<ElementListe> creerListeSemestre() throws ExceptionMetier;

    public abstract ArrayList<ElementListe> creerListeSee()
            throws ExceptionMetier;

    public abstract ArrayList<ElementListe> creerListeSeeSemestre(int idSemestre)
            throws ExceptionMetier;

    public abstract ArrayList<ElementListe> creerListeTypeEnseignement()
            throws ExceptionMetier;

    public abstract ArrayList<ElementListe> creerListeMatiere()
            throws ExceptionMetier;
    public abstract ArrayList<ElementListe> creerListeMatiereSemestre(int semestre)
    		throws ExceptionMetier;

    public abstract ArrayList <ElementListe> creerListeConge(AnneeEtude annee) throws ExceptionMetier;
    /**
     * @param listeServices
     * @return Liste des seances de cours associees a la liste des services
     *         donnee
     * @throws ExceptionMetier
     */
    public abstract Formation creerFormation(String nom, String description);
    
    public abstract Formation creerFormation();

    public abstract ArrayList<Seance> creerListeSeancePeriode(int annee, int ue, int enseignant, Date deb, Date fin) throws ExceptionMetier;
    public abstract ArrayList<ElementListe> creerListeSeanceMatiere(int matiere)
            throws ExceptionMetier;

    /**
     * @param idAnneeEtude
     * @param enseignantFiltre
     * @param uEFiltre
     * @return
     */
    public abstract ArrayList<Service> creerListeService(int idAnneeEtude,
            int enseignantFiltre, int uEFiltre);

    public abstract ArrayList<ElementListe> creerListeService(int see) throws ExceptionMetier;
    public abstract ArrayList<ElementListe> creerListeServiceMatiere(int matiere) throws ExceptionMetier;
    public abstract Incompatibilite creerIncompatibilite()throws ExceptionMetier;
        public abstract Incompatibilite creerIncompatibilite(Groupe g1, Groupe g2)throws ExceptionMetier;
         public abstract ArrayList<ElementListe> creerListeIncompatibilite()throws ExceptionMetier;

        public abstract ArrayList<ElementListe> creerListeIncompatibiliteGroupe(int idGroupe)throws ExceptionMetier;

}
